// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次，提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能，包括代码完成和许多代码浏览功能。
// 但是，如果此处列出的文件中的任何一个在生成之间有更新，它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件，这将使得性能优势无效。

#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include <filesystem>
#include <stdexcept>
//#include <ncurses.h>
#include <functional>
#include <queue>
#include <cstring>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <vector>
#include <unordered_map>
#include <ranges>
#include <map>
#include <set>
#include <deque>
#include <algorithm>
#include <numeric>
#include <ctime>
#include <cmath>

//#include <eigen3/Eigen/Dense>

//#include <format>
#include <cstdio>
//#include <getopt.h>
#include <iomanip>
#include "class_zm.h"

/*上期头文件*/
#include "dll/ThostFtdcMdApi.h"
#include "dll/ThostFtdcTraderApi.h"
#include "dll/ThostFtdcUserApiDataType.h"
#include "dll/ThostFtdcUserApiStruct.h"


//声明结构体
	//tick结构体
struct struct_tick
{
///最新价
TThostFtdcPriceType LastPrice;
///申买价一
TThostFtdcPriceType BidPrice1;
///申卖价一
TThostFtdcPriceType AskPrice1;
///持仓量
TThostFtdcLargeVolumeType OpenInterest;
///数量
TThostFtdcVolumeType Volume;
///申买量一
TThostFtdcVolumeType BidVolume1;
///申卖量一
TThostFtdcVolumeType AskVolume1;
///最后修改毫秒
TThostFtdcMillisecType UpdateMillisec;
///交易日
TThostFtdcDateType TradingDay;
///最后修改时间
TThostFtdcTimeType UpdateTime;
};


//bar结构体
struct struct_bar
{
///开盘价
TThostFtdcPriceType o;
///最高价
TThostFtdcPriceType h;
///最低价
TThostFtdcPriceType l;
///收盘价
TThostFtdcPriceType c;
///持仓量
TThostFtdcLargeVolumeType open_interest;
///数量
TThostFtdcVolumeType volume;
///日期
TThostFtdcDateType date;
///时间
TThostFtdcTimeType time;
};


//声明函数
//建立目录
bool create_path(std::string);


//AI策略获取
int tick_ai_api(int flag,int num,double *data,int &result0,int &result1);

//读取csv文件
std::vector<std::vector<std::string> > read_csv(std::string dz);

//获取日期时间
std::string get_date_time();

//日期间隔
int date_between(std::string, std::string);

//屏蔽浮点数溢出
double nomax(double x);


//获取文件列表
int get_file_list(const std::filesystem::path& path, std::vector<std::string> &lists);


//解析合约代码字符串并通过 参数2， 3， 4 分别返回类型，名称 以及期权类型时候的合约代码。返回值0代表期货；1代表期权。
int instrument_to_type(std::string str, std::string &data_type, std::string &data_name, std::string &data_to);


//事件类
class class_event
{
	public:  
//		插入一个函数调用  
		 	void insert(std::function<void()> func, int key);

//		删除一个指定的函数调用  
		 	void pop(int key);

//		通知调用  
			void notify();
//	private:  
std::map<int, std::function<void()>> funcs_map; // 存储函数调用的容器  
std::mutex mtx;
};


//线程池类
class lambda_pool
{
public:
    // 成员变量
    std::vector<std::thread> threads;
    std::mutex mtx;
    std::condition_variable cv;
    std::queue<std::function<void()>> functions;
    bool flag;

    // 构造函数
    lambda_pool();

    // 析构函数
    ~lambda_pool();

    // 循环函数
    void circle();

    // 插入新lambda
    void insert(std::function<void()> func);
};


// 常量定义
const double PI = 3.14159265358979323846;


// 累积正态分布函数（CDF）
double cumulativeNormalDistribution(double x);


// 计算布莱克-舒尔斯期权价格
double blackScholesPrice(double S, double K, double T, double r, double sigma, bool isCall);


// 求解隐含波动率的函数
double impliedVolatility(double S, double K, double T, double C, bool isCall, double r = 0.02, double sigma_low = 0.01, double sigma_high = 2.0, double tolerance = 1e-5, int max_iterations = 1000);


#endif //PCH_H
